/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bang;

/**
 *
 * @author Capucho
 */
public class Lista{
	private No ini, fim; // trocar por lista tudo isso...
	private int tam;
	
	public void setTam(int i){
		this.tam=i;
	}
	
	public int getTam(){
		return this.tam;
	}
	
	public void setIni(No n){
		this.ini=n;
	}
	
	public No getIni(){
		return this.ini;
	}
	
	public void setFim(No f){
		this.fim=f;
	}
	
	public No getFim(){
		return this.fim;
	}
	
	public Lista(){
		this.tam=0;
		this.ini=this.fim=null;
	}
        
        public void insereNo(No novo){
		if(this.tam==0){
			this.ini=this.fim=novo;
			//System.out.println("Alocou no inicio");
		}
		
		else{
			this.fim.setProx(novo);
			novo.setAnt(this.fim);
			this.setFim(novo);
			//System.out.println(fim.getInfo());
		}
		this.tam++;
	}
	
	public void imprimeLista(){
		No temp=this.ini;
		int valor = this.getTam();
		System.out.printf("Tamanho da Lista : %d\n", valor);
		
		int i=0;
		while(i<valor){
			System.out.printf("Impressao %d : ", i);
			System.out.println(temp.getCard());
			
			temp=temp.getProx();
			i++;
		}
	}
	
	/* Nao sei se vou precisar das funcoes daqui pra baixo
         */
	public void inserirQualquerPosicao(int posicao, No novo){
		int cont;
		No aux;
		
		if((posicao> (this.getTam()) || posicao < 0) || ((this.getTam())==0 && posicao!=0)){ 
			System.out.println("Posicao nao pode ser alocada");
		}
		
		if(posicao==0){ //insere no inicio
			//System.out.println("PASSEI1");
			novo.setProx(this.getIni());
			novo.setAnt(null);
			this.setIni(novo);
			this.setTam(this.getTam()+1);
		}
		
		if(posicao>0 && posicao < (this.getTam())){ //insere no meio
			//System.out.println("PASSEI2");
			aux=this.getIni();
			for(cont=0; cont<(posicao-1);cont++){
				aux=aux.getProx();
			}
			novo.setAnt(aux);
			novo.setProx(aux.getProx());
			aux.setProx(novo);
			this.setTam(this.getTam()+1);
		}

		if(posicao==(this.getTam())){//vai inserir no final
			//System.out.println("PASSEI3");
			this.fim.setProx(novo);
			novo.setAnt(this.fim);
			novo.setProx(null);
			this.setFim(novo);
			this.setTam((this.getTam())+1);
		}
	}
	
	public Object retornaObjetoPosicao(int x){ //DAR UMA OLHADA NESSA FUNCAO!!!!!!!!!!
		int i;
		No aux;
		
		if(x>(this.getTam()-1) || x<0 || (this.getTam()==0)){
			String a = new String();
			a="posicao nao existe";
			return a;
		}
		
		
		aux=this.getIni();
		
		for(i=0;i<(x);i++){ //x-1 pra pegar a posicao anterior
			aux=aux.getProx();
		}
		
		return aux.getCard();
	}
	
	public void removePosicao(int y){
		int i;
		
		No aux;
		No aux1;
		aux=this.getIni();
		
		if(y>(this.getTam()-1) || y<0 || (this.getTam()==0)){
			System.out.println("POSICAO NAO EXISTE");
		}
		
		
		else if(y==0){ //eh o primeiro
			
			aux=aux.getProx();
			aux.setAnt(null);
			this.setIni(aux);
			this.setTam((this.getTam())-1);
		}
		
		else if(y==(this.getTam()-1)){
			for(i=0; i<this.getTam()-1; i++){
				aux=aux.getProx();
			}
			
			aux.setProx(null);
			this.setFim(aux);
			this.setTam((this.getTam())-1);
			
		}
		
		else{
			for(i=0; i<(y-1); i++){
				aux=aux.getProx();
			}
			//System.out.printf("I: %d\n", i);
			
			aux.setProx((aux.getProx()).getProx());
			aux.getProx().setAnt(aux);
			this.setTam((this.getTam())-1);
		}
	}
	public boolean estaContido(Object k){
		int i;
		No aux,aux1;
		aux1=(No)k;
		//System.out.println(k);
		aux=this.getIni();
		if((this.getTam()==0)){
			return false;
		}
		
		else if(aux.getCard().equals(aux1.getCard())){
			return true;
		}
		
		else{
			for(i=0; i<this.getTam()-1; i++){
				aux=aux.getProx();
				if(aux.getCard().equals(aux1.getCard())){
					return true;
				}
			}
			return false;
		}
	}
	
	public void removerObjeto(Object w){
		No aux,aux1;
		int i;
		aux=this.getIni();
		No obj;
		
		obj= (No)w;
		
		if((this.getTam()==0)){
			System.out.println("OBJETO NAO EXISTE");
		}
		//System.out.println("ESSE EH O FIM:");
		//System.out.println(aux);
		else if((aux.getCard()).equals(obj.getCard())){
			
			//System.out.println("TESTOU1");
			aux=aux.getProx();
			System.out.println(aux);
			aux.setAnt(null);
			this.setIni(aux);
			this.setTam((this.getTam())-1);
		}
		else if((this.fim.getCard()).equals(obj.getCard())){
		
			//System.out.println("TESTOU2");
			this.fim=this.fim.getAnt();
			(this.fim).setProx(null);
			this.setTam((this.getTam())-1);
		}
		
		else{
		
			//System.out.println("TESTOU3");
			for(i=0; i<this.getTam()-1; i++){
				// aux1=aux;
				aux=aux.getProx();
				if((aux.getCard()).equals(obj.getCard())){
					//System.out.printf("Aux %d, I: %d" , aux.getInfo(), i);
					(aux.getProx()).setAnt(aux.getAnt());
					(aux.getAnt()).setProx(aux.getProx());
					this.setTam((this.getTam())-1);
					break;
				}
			}	
		}
	}
}